package com.ksyun.campus.metaserver.services;

import lombok.Data;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 文件系统检查和修复服务接口
 * 定义了文件系统一致性检查和自动修复的功能
 * 负责检测和修复块副本不足、过多副本以及其他文件系统异常
 */
public interface IFsckService {
    
    /**
     * 运行文件系统检查和修复
     * 执行全面的文件系统检查，包括：
     * 1. 检查所有块的副本数量是否符合要求
     * 2. 检查DataServer健康状态
     * 3. 修复副本不足的块（增加副本）
     * 4. 修复副本过多的块（删除多余副本）
     * 
     * @return FSCK统计信息，包含检查和修复的详细结果
     */
    FsckStats runFsck();
    
    /**
     * 获取最新的FSCK统计信息
     * 返回最近一次执行的FSCK操作的统计结果
     * 
     * @return 最新的FSCK统计，如果从未执行过FSCK则可能为null
     */
    FsckStats getLatestFsckStats();
    
    /**
     * 获取FSCK历史记录
     * 返回所有已执行的FSCK操作的统计结果列表
     * 
     * @return FSCK历史列表，按时间倒序排列
     */
    List<FsckStats> getFsckHistory();
    
    /**
     * FSCK统计信息类
     * 记录文件系统检查和修复的详细统计数据
     */
    @Data
    class FsckStats {
        /**
         * FSCK开始时间
         */
        private LocalDateTime startTime;
        
        /**
         * FSCK结束时间
         */
        private LocalDateTime endTime;
        
        /**
         * FSCK执行持续时间（毫秒）
         */
        private long durationMs;
        
        /**
         * 检查的总块数
         */
        private int totalBlocks;
        
        /**
         * 健康的DataServer数量
         */
        private int healthyDataServers;
        
        /**
         * 副本不足的块数量
         */
        private int underReplicatedBlocks;
        
        /**
         * 副本过多的块数量
         */
        private int overReplicatedBlocks;
        
        /**
         * 成功修复的块数量
         */
        private int repairedBlocks;
        
        /**
         * 修复失败的块数量
         */
        private int failedRepairs;
        
        /**
         * 损坏的块数量（元数据与实际存在不一致）
         */
        private int corruptedBlocks;
        
        /**
         * 错误信息，如果FSCK过程中发生严重错误
         */
        private String errorMessage;
        
        /**
         * 增加副本不足的块计数
         */
        public void incrementUnderReplicatedBlocks() {
            this.underReplicatedBlocks++;
        }
        
        /**
         * 增加副本过多的块计数
         */
        public void incrementOverReplicatedBlocks() {
            this.overReplicatedBlocks++;
        }
        
        /**
         * 增加成功修复的块计数
         */
        public void incrementRepairedBlocks() {
            this.repairedBlocks++;
        }
        
        /**
         * 增加修复失败的块计数
         */
        public void incrementFailedRepairs() {
            this.failedRepairs++;
        }
        
        /**
         * 增加损坏的块计数
         */
        public void incrementCorruptedBlocks() {
            this.corruptedBlocks++;
        }
    }
}
